package v1

import (
	"hr/api/dto"
	"hr/api/middleware"
	"hr/db"
	"hr/utils"
	"time"

	"github.com/gin-gonic/gin"
	"github.com/spf13/cast"
)

// GetApplicationManagePaging
// @Summary 获取所有应聘 1、等待面试； 2、同意面试 3、面试结束/等待结果 4、同意入职  5、拒绝入职
// @Tags 应聘相关api
// @Accept  json
// @Produce json
// @Param Access-Token header string true "Authentication header"
// @Param pageNo query string true "页码"
// @Param pageSize query string true "页大小"
// @Success 200 {object} utils.JsonContent
// @Failure 400 {object} utils.JsonContent
// @Failure 500 {object} utils.JsonContent
// @Router /api/v1/auth/application_manage/getPaging [get]
func GetApplicationManagePaging(c *gin.Context) {
	pageNoStr := c.Query("pageNo")
	pageSizeStr := c.Query("pageSize")
	name := c.Query("name")

	var pageNo, pageSize int
	if !utils.IsStringEmpty(pageNoStr) {
		pageNo = cast.ToInt(pageNoStr)
	}
	if !utils.IsStringEmpty(pageSizeStr) {
		pageSize = cast.ToInt(pageSizeStr)
	}
	paging := &dto.Pagination{
		PageNo:   pageNo,
		PageSize: pageSize,
	}

	d, err := db.GetApplicationManagePaging(*paging, name)
	if err != nil {
		utils.EchoError(c, err.Error())
		return
	}
	utils.EchoSuccess(c, d, "请求成功")
	return
}

// GetApplicationManage
// @Summary 获取单个应聘
// @Tags 应聘相关api
// @Accept  json
// @Produce json
// @Param Access-Token header string true "Authentication header"
// @Param id query string true "id"
// @Success 200 {object} utils.JsonContent
// @Failure 400 {object} utils.JsonContent
// @Failure 500 {object} utils.JsonContent
// @Router /api/v1/auth/application_manage/get/{id} [get]
func GetApplicationManage(c *gin.Context) {
	id := c.Query("id")
	if !utils.IsStringEmpty(id) {
		utils.EchoError(c, "主键id不能为空")
		return
	}

	d, err, _ := db.GetApplicationManage(map[string]interface{}{
		"id": id,
	})
	if err != nil {
		utils.EchoError(c, err.Error())
		return
	}
	utils.EchoSuccess(c, d, "请求成功")
	return
}

// GetLatestApplication
// @Summary 获取游客最新的应聘
// @Tags 应聘相关api
// @Accept  json
// @Produce json
// @Param Access-Token header string true "Authentication header"
// @Success 200 {object} utils.JsonContent
// @Failure 400 {object} utils.JsonContent
// @Failure 500 {object} utils.JsonContent
// @Router /api/v1/auth/application_manage/get [get]
func GetLatestApplication(c *gin.Context) {
	id, _ := middleware.GetCurrentUserId(c)
	application := db.GetLatestApplicationByUserId(id)
	if application.ID == 0 {
		utils.EchoSuccess(c, nil, "请求成功")
		return
	}
	utils.EchoSuccess(c, application, "请求成功")
	return
}

// CreateApplicationManage
// @Summary 创建应聘
// @Tags 应聘相关api
// @Accept  json
// @Produce json
// @Param Access-Token header string true "Authentication header"
// @Param ApplicationManageRequest body dto.ApplicationManageRequest true "信息"
// @Success 200 {object} utils.JsonContent
// @Failure 400 {object} utils.JsonContent
// @Failure 500 {object} utils.JsonContent
// @Router /api/v1/auth/application_manage [post]
func CreateApplicationManage(c *gin.Context) {
	p := &dto.ApplicationManageRequest{}
	if err := c.ShouldBindJSON(p); err != nil {
		utils.EchoError(c, "缺少必要参数信息")
		return
	}

	id, _ := middleware.GetCurrentUserId(c)
	application := db.GetLatestApplicationByUserId(id)

	isExist, _ := db.CheckExistByUserIdAndJob(id, p.JobId)

	if isExist {
		utils.EchoError(c, "您之前投递过此岗位")
		return
	}

	if utils.TimeIntervalDay(time.Now(), application.CreatedAt) < 7 {
		utils.EchoError(c, "您7天之内投递过简历")
		return
	}

	m, err := db.CreateApplicationManage(*p, cast.ToString(id))
	if err != nil {
		utils.EchoError(c, err.Error())
		return
	}

	utils.EchoSuccess(c, m, "创建成功")
	return
}

// UpdateApplicationManage
// @Summary 更新应聘
// @Tags 应聘相关api
// @Accept  json
// @Produce json
// @Param Access-Token header string true "Authentication header"
// @Param ApplicationManageRequest body dto.ApplicationManageRequest true "信息"
// @Param id path string true "主键ID"
// @Success 200 {object} utils.JsonContent
// @Failure 400 {object} utils.JsonContent
// @Failure 500 {object} utils.JsonContent
// @Router /api/v1/auth/application_manage/{id} [put]
func UpdateApplicationManage(c *gin.Context) {
	p := &dto.ApplicationManageRequest{}
	if err := c.ShouldBindJSON(p); err != nil {
		utils.EchoError(c, "缺少必要参数信息")
		return
	}
	idStr := c.Param("id")
	if utils.IsStringEmpty(idStr) {
		utils.EchoError(c, "缺少ID")
		return
	}
	_, _, tag := db.GetApplicationManage(map[string]interface{}{"id": idStr})
	if tag == "0" || tag == "1" {
		utils.EchoError(c, "此应聘不存在")
		return
	}
	id, _ := middleware.GetCurrentUserId(c)
	m, err := db.UpdateApplicationManage(cast.ToUint(idStr), *p, cast.ToString(id))
	if err != nil {
		utils.EchoError(c, err.Error())
		return
	}

	user := dto.UserRequest{}
	user.IsStaff = p.Status

	if p.Status == "4" {
		_, err = db.UpdateUser(cast.ToUint(m.User.ID), user, cast.ToString(id))
		if err != nil {
			utils.EchoError(c, err.Error())
			return
		}
	}

	utils.EchoSuccess(c, m, "更新成功")
	return
}

// DeleteApplicationManage
// @Summary 删除应聘
// @Tags 应聘相关api
// @Accept  json
// @Produce json
// @Param Access-Token header string true "Authentication header"
// @Param id path string true "主键ID"
// @Success 200 {object} utils.JsonContent
// @Failure 400 {object} utils.JsonContent
// @Failure 500 {object} utils.JsonContent
// @Router /api/v1/auth/application_manage/{id} [delete]
func DeleteApplicationManage(c *gin.Context) {
	idStr := c.Param("id")
	if utils.IsStringEmpty(idStr) {
		utils.EchoError(c, "缺少ID")
		return
	}
	_, _, tag := db.GetApplicationManage(map[string]interface{}{"id": idStr})
	if tag == "0" || tag == "1" {
		utils.EchoError(c, "此应聘不存在")
		return
	}
	_, err := db.DeleteApplicationManage(cast.ToUint(idStr))
	if err != nil {
		utils.EchoError(c, err.Error())
		return
	}

	utils.EchoSuccess(c, nil, "删除成功")
	return
}
